---
title: FAQs
description: bloc লাইব্রেরি সম্পর্কিত প্রায়শই জিজ্ঞাসিত প্রশ্নগুলোর উত্তর।
---

import StateNotUpdatingGood1Snippet from '~/components/faqs/StateNotUpdatingGood1Snippet.astro';
import StateNotUpdatingGood2Snippet from '~/components/faqs/StateNotUpdatingGood2Snippet.astro';
import StateNotUpdatingGood3Snippet from '~/components/faqs/StateNotUpdatingGood3Snippet.astro';
import StateNotUpdatingBad1Snippet from '~/components/faqs/StateNotUpdatingBad1Snippet.astro';
import StateNotUpdatingBad2Snippet from '~/components/faqs/StateNotUpdatingBad2Snippet.astro';
import StateNotUpdatingBad3Snippet from '~/components/faqs/StateNotUpdatingBad3Snippet.astro';
import EquatableEmitSnippet from '~/components/faqs/EquatableEmitSnippet.astro';
import EquatableBlocTestSnippet from '~/components/faqs/EquatableBlocTestSnippet.astro';
import NoEquatableBlocTestSnippet from '~/components/faqs/NoEquatableBlocTestSnippet.astro';
import SingleStateSnippet from '~/components/faqs/SingleStateSnippet.astro';
import SingleStateUsageSnippet from '~/components/faqs/SingleStateUsageSnippet.astro';
import BlocProviderGood1Snippet from '~/components/faqs/BlocProviderGood1Snippet.astro';
import BlocProviderGood2Snippet from '~/components/faqs/BlocProviderGood2Snippet.astro';
import BlocProviderBad1Snippet from '~/components/faqs/BlocProviderBad1Snippet.astro';
import BlocInternalAddEventSnippet from '~/components/faqs/BlocInternalAddEventSnippet.astro';
import BlocInternalEventSnippet from '~/components/faqs/BlocInternalEventSnippet.astro';
import BlocExternalForEachSnippet from '~/components/faqs/BlocExternalForEachSnippet.astro';

## State Not Updating

❔ **প্রশ্ন**: আমি আমার bloc-এ state emit করছি কিন্তু UI আপডেট হচ্ছে না। আমি কী
ভুল করছি?

💡 **উত্তর**: আপনি যদি Equatable ব্যবহার করেন তাহলে props getter-এ অবশ্যই সমস্ত
প্রপার্টি পাস করছেন কিনা নিশ্চিত করুন।

✅ **ভাল**

<StateNotUpdatingGood1Snippet />

❌ **খারাপ**

<StateNotUpdatingBad1Snippet />

<StateNotUpdatingBad2Snippet />

এছাড়াও, bloc-এর ভিতরে আপনি একটি নতুন state instance emit করছেন তা নিশ্চিত করুন।

✅ **ভাল**

<StateNotUpdatingGood2Snippet />

<StateNotUpdatingGood3Snippet />

❌ **খারাপ**

<StateNotUpdatingBad3Snippet />

:::caution

`Equatable` প্রপার্টিগুলো কখনও modify করা উচিত নয়, বরং সবসময় copy করা উচিত।  
যদি কোনো `Equatable` ক্লাসে `List` বা `Map` থাকে, তবে রেফারেন্সের উপর ভিত্তি না
করে মানের উপর ভিত্তি করে equality নির্ধারণ করতে যথাক্রমে `List.of` বা `Map.of`
ব্যবহার করুন।

:::

## Equatable কবে ব্যবহার করবেন

❔**প্রশ্ন**: কবে আমি Equatable ব্যবহার করব?

💡**উত্তর**:

<EquatableEmitSnippet />

উপরের ক্ষেত্রে যদি `StateA` `Equatable` এক্সটেন্ড করে তবে শুধুমাত্র একটি state
change হবে (দ্বিতীয় emit উপেক্ষা করা হবে)। সাধারণভাবে, আপনি যদি rebuild কমিয়ে
অপ্টিমাইজ করতে চান তাহলে `Equatable` ব্যবহার করা উচিত। আপনি যদি একই state
back-to-back হলেও একাধিক transition চান তাহলে `Equatable` ব্যবহার করা উচিত নয়।

এছাড়াও, `Equatable` ব্যবহারে bloc টেস্ট করা সহজ হয় কারণ আমরা নির্দিষ্ট স্টেট
instance আশা করতে পারি `Matchers` বা `Predicates` ব্যবহারের পরিবর্তে।

<EquatableBlocTestSnippet />

`Equatable` ছাড়া উপরের টেস্ট ব্যর্থ হবে এবং এভাবে পুনঃলিখন করতে হবে:

<NoEquatableBlocTestSnippet />

## ত্রুটি (Error) হ্যান্ডলিং

❔ **প্রশ্ন**: আগের ডেটা দেখানো অবস্থায় কিভাবে আমি error হ্যান্ডেল করব?

💡 **উত্তর**:

এটি bloc-এর state কিভাবে মডেল করা হয়েছে তার উপর অনেকটাই নির্ভর করে। এমন
ক্ষেত্রে যেখানে error থাকলেও ডেটা রেখে দেওয়া উচিত, একটি single state class
ব্যবহার করার কথা বিবেচনা করুন।

<SingleStateSnippet />

এতে widget গুলো একসাথে `data` এবং `error` পাওয়ার সুবিধা পাবে এবং bloc
`state.copyWith` ব্যবহার করে error থাকলেও পুরনো ডেটা ধরে রাখতে পারবে।

<SingleStateUsageSnippet />

## Bloc বনাম Redux

❔ **প্রশ্ন**: Bloc এবং Redux-এর মধ্যে পার্থক্য কী?

💡 **উত্তর**:

BLoC একটি ডিজাইন প্যাটার্ন যা নিম্নলিখিত নিয়ম দ্বারা সংজ্ঞায়িত:

1. BLoC-এর Input এবং Output শুধু Streams এবং Sinks।
2. Dependencies injectable এবং প্ল্যাটফর্ম-অ্যাগনস্টিক হতে হবে।
3. কোনো প্ল্যাটফর্ম branching অনুমোদিত নয়।
4. উপরের নিয়ম মেনে চললে যেকোনো implementation ব্যবহার করা যায়।

UI নির্দেশিকা:

1. প্রতিটি “যথেষ্ট জটিল” কম্পোনেন্টের একটি BLoC থাকে।
2. কম্পোনেন্টগুলো ইনপুট পাঠাবে “as is”।
3. কম্পোনেন্টগুলো আউটপুট দেখাবে যতটা সম্ভব “as is”।
4. সকল branching হবে সহজ BLoC boolean আউটপুটের উপর ভিত্তি করে।

Bloc লাইব্রেরি BLoC ডিজাইন প্যাটার্ন বাস্তবায়ন করে এবং RxDart abstraction দিয়ে
developer experience সহজ করে।

Redux-এর তিনটি নীতি:

1. Single source of truth
2. State read-only
3. পরিবর্তন pure functions দিয়ে করা হয়

bloc লাইব্রেরি প্রথম নীতি লঙ্ঘন করে; bloc state বহু bloc-এ বিতরণ করা হয়।
এছাড়াও bloc-এ middleware-এর ধারণা নেই এবং async state পরিবর্তন খুব সহজ, যেখানে
একটি event-এর জন্য একাধিক state emit করা যায়।

## Bloc বনাম Provider

❔ **প্রশ্ন**: Bloc আর Provider-এর মধ্যে পার্থক্য কী?

💡 **উত্তর**: `provider` dependency injection-এর জন্য তৈরি (এটি
`InheritedWidget` কে wrap করে)।  
আপনাকে এখনও state ম্যানেজমেন্ট বেছে নিতে হবে (`ChangeNotifier`, `Bloc`, `Mobx`,
ইত্যাদি)।  
Bloc লাইব্রেরি অভ্যন্তরীণভাবে `provider` ব্যবহার করে widget tree তে bloc সরবরাহ
ও ব্যবহারের সুবিধার জন্য।

## BlocProvider.of() Bloc খুঁজে পাচ্ছে না

❔ **প্রশ্ন**: `BlocProvider.of(context)` ব্যবহার করলে bloc খুঁজে পায় না। আমি
কীভাবে এটি ঠিক করব?

💡 **উত্তর**: একই context থেকে bloc অ্যাক্সেস করা যায় না যেখানে এটি provide করা
হয়েছে। তাই নিশ্চিত করুন `BlocProvider.of()` একটি child `BuildContext` এর ভিতরে
কল হচ্ছে।

✅ **ভাল**

<BlocProviderGood1Snippet />

<BlocProviderGood2Snippet />

❌ **খারাপ**

<BlocProviderBad1Snippet />

## Project Structure

❔ **প্রশ্ন**: আমি আমার প্রজেক্ট কীভাবে গঠন করব?

💡 **উত্তর**: এই প্রশ্নের আসলে ঠিক/ভুল বলে কিছু নেই,  
কিছু সুপারিশকৃত উদাহরণ হলো:

- [I/O Photobooth](https://github.com/flutter/photobooth)
- [I/O Pinball](https://github.com/flutter/pinball)
- [Flutter News Toolkit](https://github.com/flutter/news_toolkit)

সবচেয়ে গুরুত্বপূর্ণ হলো **একটি সুনির্দিষ্ট** এবং **উদ্দেশ্যপূর্ণ** project
structure বজায় রাখা।

## Bloc-এর ভিতরে Events যোগ করা

❔ **প্রশ্ন**: একটি bloc-এর ভিতরে event যোগ করা কি ঠিক?

💡 **উত্তর**: বেশিরভাগ ক্ষেত্রে event বাইরে থেকে যোগ করা উচিত, তবে কিছু ক্ষেত্রে
ভিতরে যোগ করা যুক্তিসঙ্গত।

সবচেয়ে সাধারণ অভ্যন্তরীণ event ব্যবহারের পরিস্থিতি হলো যখন repository থেকে
real-time আপডেটে state পরিবর্তন করতে হয়। এখানে repository হল state পরিবর্তনের
stimulus, কোনো বাহ্যিক ইভেন্ট (যেমন বাটন ট্যাপ) নয়।

নিচের উদাহরণে, `MyBloc` এর state নির্ভর করে বর্তমান user-এর উপর, যা
`UserRepository` থেকে `Stream<User>` হিসাবে আসে।  
`MyBloc` user stream শুনে এবং যখনই একটি user emit হয় তখন অভ্যন্তরীণ
`_UserChanged` event যোগ করে।

<BlocInternalAddEventSnippet />

অভ্যন্তরীণ event যোগ করে আমরা event-এর জন্য custom `transformer` নির্ধারণ করতে
পারি — ডিফল্টভাবে সেগুলো concurrent প্রসেস হয়।

Internal event ব্যক্তিগত (private) রাখা অত্যন্ত সুপারিশ করা হয়।  
এটি স্পষ্টভাবে বোঝায় যে event শুধুমাত্র bloc-এর ভিতর ব্যবহৃত হয় এবং বাইরের
কম্পোনেন্ট তা অ্যাক্সেস করতে পারে না।

<BlocInternalEventSnippet />

আমরা বিকল্পভাবে একটি বাহ্যিক `Started` event ব্যবহার করতে পারি এবং
`emit.forEach` API ব্যবহার করে real-time user update হ্যান্ডেল করতে পারি:

<BlocExternalForEachSnippet />

এর সুবিধাসমূহ:

- আমাদের internal `_UserChanged` event দরকার হয় না
- `StreamSubscription` ম্যানুয়ালি ম্যানেজ করতে হয় না
- bloc কখন user stream-এ subscribe করবে তার সম্পূর্ণ নিয়ন্ত্রণ থাকে

অসুবিধাসমূহ:

- subscription সহজে `pause` বা `resume` করা যায় না
- একটি public `Started` event প্রকাশ করতে হয় যা বাইরে থেকে add করতে হয়
- user update প্রসেস করার উপায় কাস্টমাইজ করার জন্য custom `transformer` ব্যবহার
  করা যায় না

## Public Methods প্রকাশ করা

❔ **প্রশ্ন**: আমার bloc বা cubit instance-এ public method প্রকাশ করা কি ঠিক?

💡 **উত্তর**

Cubit তৈরি করার সময় শুধু state পরিবর্তনের জন্য public method রাখা সুপারিশ করা
হয়।  
সাধারণত cubit-এর সব public method `void` বা `Future<void>` return করা উচিত।

Bloc তৈরি করার সময় custom public method প্রকাশ না করে শুধুমাত্র event যোগ করে
(`add`) bloc-কে notify করাই সুপারিশ করা হয়।
